#include <QtGui>
#include <QtSql>

#include "DlgHaupt.h"
#include "Vorgaben.h"
#include "DlgKategorie.h"
#include "Datenverwaltung.h"
#include "Datumeditor.h"
#include "Werteditor.h"

#ifdef KDCHART_JA
#include "Diagramm.h"
#endif

DlgHaupt::DlgHaupt(QWidget *eltern) : QMainWindow(eltern)
{
  K_Datenverwaltung=new Datenverwaltung(this);
  K_Monatsgruppe=new QButtonGroup(this);

  setupUi(this);
#ifndef KDCHART_JA
  tabAuswahl->setTabEnabled(1,false);
#else
  K_Diagramme=new Diagramm(this,DgAusgaben,DgEinnahmen,K_Datenverwaltung);
  connect(K_Datenverwaltung,SIGNAL(Bereit()),K_Diagramme,SLOT(DatenBereit()));
#endif

  dDatum->setDate(QDate::currentDate());
  QRect Bildschirm = QApplication::desktop()->screenGeometry();
  int x = (Bildschirm.width()-this->width()) / 2;
  int y = (Bildschirm.height()-this->height()) / 2;
  this->move(x,y);

  dDatum->calendarWidget()->setFirstDayOfWeek(Qt::Monday);

  K_Monatsgruppe->addButton(sfJanuar,1);
  K_Monatsgruppe->addButton(sfFebruar,2);
  K_Monatsgruppe->addButton(sfMaerz,3);
  K_Monatsgruppe->addButton(sfApril,4);
  K_Monatsgruppe->addButton(sfMai,5);
  K_Monatsgruppe->addButton(sfJuni,6);
  K_Monatsgruppe->addButton(sfJuli,7);
  K_Monatsgruppe->addButton(sfAugust,8);
  K_Monatsgruppe->addButton(sfSeptember,9);
  K_Monatsgruppe->addButton(sfOktober,10);
  K_Monatsgruppe->addButton(sfNovember,11);
  K_Monatsgruppe->addButton(sfDezember,12);

  connect(K_Monatsgruppe,SIGNAL(buttonClicked(int)),this,SLOT(Monatwechsel(int)));
  connect(K_Datenverwaltung,SIGNAL(Fehler(QString)),this,SLOT(FehlerAufgetreten(QString)));
  connect(K_Datenverwaltung,SIGNAL(Bereit()),this,SLOT(DatenBereit()));
  QTimer::singleShot(0,K_Datenverwaltung,SLOT(Laden()));
}

void DlgHaupt::changeEvent(QEvent *e)
{
  QMainWindow::changeEvent(e);
  switch (e->type())
  {
    case QEvent::LanguageChange:
				retranslateUi(this);
				break;
    default:
				break;
  }
}
void DlgHaupt::on_action_Ueber_triggered()
{
  QString KD=tr("Ja");
#ifndef KDCHART_JA
  KD=tr("Nein");
#endif

  QMessageBox::information(this,trUtf8("Information"),
			   tr("Programmversion: %1\nDatenbankversion: %3\nQt Version: %2\nDieses Programm unterliegt der GPL."
			      "\nKD Chart aktiviert: %4")
			      .arg(VERSION).arg(qVersion()).arg(K_Datenverwaltung->Datenbankversion()).arg(KD));
}
void DlgHaupt::on_action_KategorienVerwalten_triggered()
{
  DlgKategorie *kat=new DlgKategorie(this,K_Datenverwaltung);
  if(kat->exec()==QDialog::Accepted)
   K_Datenverwaltung->KategorieaenderungSpeichern();
  else
    K_Datenverwaltung->KategorieModell()->revertAll();
  kat->deleteLater();
}
void DlgHaupt::FehlerAufgetreten(const QString &text)
{
  Ui_DlgHaupt::statusBar->showMessage(tr("Ein Fehler ist aufgetreten."));
  QMessageBox::critical(this,tr("Es ist ein Fehler aufgetreten."),text);
}
void DlgHaupt::DatenBereit()
{
  connect(K_Datenverwaltung->PostenlisteModell(),SIGNAL(dataChanged(QModelIndex,QModelIndex)),this,SLOT(DatenGeaendert()));
  tabTabelle->setModel(K_Datenverwaltung->PostenlisteModell());
  tabTabelle->hideColumn(0);
  tabTabelle->setItemDelegate(new QSqlRelationalDelegate(tabTabelle));
  tabTabelle->setItemDelegateForColumn(1,new Datumeditor(tabTabelle));
  tabTabelle->setItemDelegateForColumn(3,new Werteditor(tabTabelle));
  tabTabelle->resizeColumnsToContents();
  sbJahr->setValue(QDate::currentDate().year());
  txtKategorie->setModel(K_Datenverwaltung->KategorieModell());
  txtKategorie->setModelColumn(1);
  action_KategorienVerwalten->setEnabled(true);
  sbJahr->setEnabled(true);
  gbMonat->setEnabled(true);
  gbNeu->setEnabled(true);
  Monatwechsel(QDate::currentDate().month());
  Ui_DlgHaupt::statusBar->showMessage(tr("Willkommen zum Haushaltsbuch %1.").arg(VERSION));
}
void DlgHaupt::on_sbJahr_valueChanged(int jahr)
{
  if(jahr>=1970)
    K_Datenverwaltung->PostenJahr(jahr);
}
void DlgHaupt::Monatwechsel(const int&welcher)
{
  static int alt=0;
  if(alt!=0)
    K_Monatsgruppe->button(alt)->setEnabled(true);
  alt=welcher;
  K_Monatsgruppe->button(alt)->setEnabled(false);
  K_Datenverwaltung->PostenMonat(welcher);
}
void DlgHaupt::on_sfErfassen_clicked()
{
  if((txtBeschreibung->text().isEmpty())||(txtWert->value()==0))
  {
    QMessageBox::warning(this,tr("Fehler"),trUtf8("Alle Felder müssen ausgefüllt werden."));
    return;
  }
  K_Datenverwaltung->PostenAnlegen(dDatum->date(),txtBeschreibung->text(),txtWert->value(),
				   K_Datenverwaltung->KategorieModell()->data(
				   K_Datenverwaltung->KategorieModell()->index(txtKategorie->currentIndex(),0)).toString());
}
void DlgHaupt::on_txtWert_valueChanged(double wert)
{
  static QPalette rot;
  static QPalette normal;
  rot.setColor(QPalette::Text,Qt::red);
  QPalette Palette;
  if(wert>=0)
    Palette=normal;
  else
    Palette=rot;
  txtWert->setPalette(Palette);
}
void DlgHaupt::on_sfLoeschen_clicked()
{
  QItemSelectionModel* Auswahl=tabTabelle->selectionModel();
  if(!Auswahl->hasSelection())
  {
    QMessageBox::warning(this,tr("Fehler"),trUtf8("Es wurde nichts zum Löschen ausgewählt."));
    return;
  }
  QModelIndexList Liste=Auswahl->selectedRows();
  foreach(QModelIndex Eintrag,Liste)
  {
    /*Nur ausblenen wenn man sie löschen konnte*/
    if(K_Datenverwaltung->PostenLoeschen(Eintrag.row()))
      tabTabelle->hideRow(Eintrag.row());
  }
}
void DlgHaupt::on_sfAendern_clicked()
{
  K_Datenverwaltung->PostenlisteModell()->submitAll();
}
void DlgHaupt::DatenGeaendert()
{
  tabTabelle->resizeColumnsToContents();
}
